#include<iostream>
#include<vector>
#include<stack>
using namespace std;

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        // 答案 = max{以heights[i]为高，左右扩展，能得到的最大面积}
        int n = heights.size();
        vector<int> left(n), right(n);
        stack<int> st1; // 前向单调增栈（保存索引）
        stack<int> st2; // 反向单调增栈（保存索引）

        // 前向扫描，求每个柱子的左边第一个比它小的柱子下标
        for (int i = 0; i < n; i++) {
            while (!st1.empty() && heights[st1.top()] >= heights[i]) {
                st1.pop();
            }
            left[i] = st1.empty() ? -1 : st1.top();
            st1.push(i);
        }

        // 反向扫描，求每个柱子的右边第一个比它小的柱子下标
        for (int i = n - 1; i >= 0; i--) {
            while (!st2.empty() && heights[st2.top()] >= heights[i]) st2.pop();
            right[i] = st2.empty() ? n : st2.top();
            st2.push(i);
        }

        int maxArea = 0;
        for (int i = 0; i < n; i++) {
            int width = right[i] - left[i] - 1;
            maxArea = max(maxArea, heights[i] * width);
        }

        // // 打印每个位置对应的左边界和右边界
        // for (int i = 0; i < n; i++) {
        //     cout << "i=" << i 
        //          << " height=" << heights[i] 
        //          << " left=" << left[i] 
        //          << " right=" << right[i] 
        //          << " area=" << heights[i] * (right[i] - left[i] - 1)
        //          << endl;
        // }

        return maxArea;
    }
};
